package customerEnter.Frame.Utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import customerEnter.Frame.DaoDataTransmission.DaoFramUpdateOrAddMap;
import customerEnter.Frame.Enum.UpdateTableZeroAndEmpty;
import customerEnter.Frame.oss.OSSUseTransmission;
import customerEnter.tool.WhetherToEmpty;

/**
 * java 反射 工具類
 * 
 * 类名称：javaReflexClass 类描述： 创建人：dy 创建时间：2016-10-13 下午2:54:06
 * 
 */
public class javaReflexClass {

	public static void main(String[] args) throws Exception, Exception {
		// IsSetAndGetAssignment(OSSUseTransmission.class);

		// 循環使用
	}

	/**
	 * 通過get 和set方法賦值 但是屬性首字母要大寫 不建議使用 容易出錯
	 */
	@SuppressWarnings("rawtypes")
	public static void IsSetAndGetAssignment(Class<?> cla) throws Exception, Exception {
		Field[] field = cla.getDeclaredFields();
		for (Field field2 : field) {
			field2.setAccessible(true);
			Method m = cla.getMethod("get" + field2.getName());
			String value = (String) m.invoke(OSSUseTransmission.class); // 调用getter方法获取属性值
			if (value == null) {
				System.out.println(field2.getType().getName());
				Class class1 = Class.forName(field2.getType().getName());
				m = cla.getMethod("set" + field2.getName(), class1);
				m.invoke(cla, "值");
			}
		}
	}

	/**
	 * 通過屬性賦值
	 * 
	 * @param cla
	 *            要賦值的類
	 * @param name
	 *            屬性名稱
	 * @param value
	 *            屬性值
	 */
	public static void IsAssignment(Object cla, String name, Object value) throws Exception, Exception {
		Field[] field = cla.getClass().getDeclaredFields();
		for (Field field2 : field) {
			field2.setAccessible(true);
			if (name.equals(field2.getName())) {
				field2.set(cla, value);
			}
		}
	}

	/**
	 * 根據反射獲取bean的屬性值和 屬性名字
	 * 
	 * @param fieldNames
	 *            字符串格式為 name,pass,pic,age
	 * @param values
	 *            字符串格式為 "zs","123456","http://....",32
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @return 添加的数据
	 */
	public static DaoFramUpdateOrAddMap getObjectNamesAndValuesAdd(Object t) throws IllegalArgumentException,
			IllegalAccessException {
		DaoFramUpdateOrAddMap daoFramUpdateOrAddMap = new DaoFramUpdateOrAddMap();
		Field[] fields = t.getClass().getDeclaredFields();
		for (Field field : fields) {
			if ("serialVersionUID".equals(field.getName()) || "id".equals(field.getName())
					|| "extra_".contains(field.getName())) {
				continue;
			}
			field.setAccessible(true);
			// 保留全部屬性
			daoFramUpdateOrAddMap.getData().put(field.getName(), StringContext(field, t));
		}
		return daoFramUpdateOrAddMap;
	}

	/**
	 * 根據反射獲取bean的屬性值和 屬性名字
	 * 
	 * @param fieldNames
	 *            字符串格式為 name,pass,pic,age
	 * @param values
	 *            字符串格式為 "zs","123456","http://....",32
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @return 修改数据
	 */
	public static DaoFramUpdateOrAddMap getObjectNamesAndValuesUpdate(Object t) throws IllegalArgumentException,
			IllegalAccessException {

		DaoFramUpdateOrAddMap daoFramUpdateOrAddMap = new DaoFramUpdateOrAddMap();

		Field[] fields = t.getClass().getDeclaredFields();
		for (Field field : fields) {
			if ("serialVersionUID".equals(field.getName()) || "id".equals(field.getName())
					|| "extra_".contains(field.getName())) {
				continue;
			}
			field.setAccessible(true);
			Object context = field.get(t);
			// 數據為空屬性去掉
			if (WhetherToEmpty.ObjectWhetherToEmpty(context) || context.equals(0)) {
				continue;
			} else {
				daoFramUpdateOrAddMap.getData().put(field.getName(), StringContext(field, t));
			}

		}
		return daoFramUpdateOrAddMap;
	}

	/**
	 * 判断修改的数据 要不要修改为空和0
	 */
	public static Object StringContext(Field field, Object t) throws IllegalArgumentException, IllegalAccessException {

		Object value = "";
		// 下面这两个只用于修改的时候
		String size = UpdateTableZeroAndEmpty.Empty.getVALUE() + "";// int 最大数据
																	// 2147483647
		Integer in = UpdateTableZeroAndEmpty.Zero.getVALUE();// int 最小数据
																// -2147483648
		// 修改数据的时候 如果是string 类型 和date类型
		if (WhetherToClass.IfString(field.getType().getName()) || WhetherToClass.IfDate(field.getType().getName())) {
			// 如果是要修改数据为空（size 和 传入的数据一致）
			if (size.equals(field.get(t))) {
				value = "''";
			} else {
				value = "'" + field.get(t) + "'";
			}

		} else {
			// 如果是要修改数据为0（in 和 传入的数据一致）
			if (in.equals(field.get(t))) {
				value = 0 + "";
			} else {
				value = field.get(t) + "";
			}
		}

		return value;
	}
}
